//单进程中的（线程）同步
// Mutex管理的是资源的使用权，而Semaphore管理的是资源的数量
#include <stdio.h>
#include <stdlib.h>
#include <pthread.h>
#include <semaphore.h>
#include <stdint.h>
#include <string.h>
#include <errno.h>

#include "m_timespec.h"

int sem_waitms(sem_t *sem, long msecs)
{
    int ret;
    int semvalue;
    struct timespec timeout;

    sem_getvalue(sem, &semvalue);
    printf("call sem_waitms start, cur semvalue(%d)\n", semvalue);

    if (msecs < 0)
    {
        ret = sem_wait(sem);
    }
    else if (msecs == 0)
    {
        ret = sem_trywait(sem);
    }
    else
    {
        timeout = ms2timespec(msecs);

        //如果sem信号量值>0，则立即返回；
        //如果sem信号量值≤0，则阻塞msecs后再返回。
        //如果被信号中断，应重新等待
        while ((ret = sem_timedwait(sem, &timeout)) == -1 && errno == EINTR)
            continue;
    }

    if (ret != 0)
        printf("call sem_waitms failed! (%s)\n", strerror(errno));
    else
        printf("call sem_waitms done\n");

    return ret;
}

int main(void)
{
    sem_t sem;
    sem_init(&sem, 0, 0);
    sem_post(&sem);
    sem_post(&sem);
    sem_post(&sem);

    while (1)
    {
        if (sem_waitms(&sem, 5000) < 0)
            break;
    }

    sem_destroy(&sem);

    return 0;
}
